package com.honey.compilation.sql.ddl;

import java.util.ArrayList;
import java.util.List;

import com.honey.compilation.sql.SqlColumn;
import com.honey.compilation.sql.SqlKeyWord;
import com.honey.compilation.sql.SqlScript;
import com.honey.compilation.sql.SqlTable;
import com.honey.core.builder.CharacterBuilder;
import com.honey.core.builder.CharacterBuilderFactory;
import com.honey.core.compiler.CompilationException;
import com.honey.core.compiler.IndentSpace;
import com.honey.core.utils.StringUtility;


/**
 * 修改表命令: ALERT TABLE DROP
 * @author Administrator
 *
 */
public class AlterTableDrop extends AlterTable implements SqlScript{
	
	/** 删除类型 */
	private DropType dropType ;
	
	/** 列 */
	private List<String> columns ;
	
	/**
	 * 构造函数
	 * @param tableName 表的名称
	 */
	public AlterTableDrop(String tableName) {
		super(tableName);	
		dropType= DropType.COLUMN;
		columns = new ArrayList<String>();
	}
	
	/**
	 * 构造函数
	 * @param table 数据库表对象
	 */
	public AlterTableDrop(SqlTable table){
		super(table);
		dropType= DropType.COLUMN;
		columns = new ArrayList<String>();
	}
	
	/**
	 * 构造函数
	 * @param tableName 表的名称
	 * @param columns 列
	 */
	public AlterTableDrop(String schema, String tableName) {
		super(schema, tableName);	
		dropType= DropType.COLUMN;
		columns = new ArrayList<String>();
	}

	/**
	 * 构造函数
	 * @param tableName 表的名称
	 * @param columns 列
	 */
	public AlterTableDrop(String tableName, SqlColumn ...columns) {
		this(tableName);	
		addColumn(columns);
	}
	
	/**
	 * 构造函数
	 * @param columns 列
	 */
	public void addColumn(String ...columns){
		for(String column : columns)
			if(StringUtility.stringHasValue(column))this.columns.add(column);
	}
	
	/**
	 * 构造函数
	 * @param columns 列
	 */
	public void addColumn(SqlColumn ...columns){
		for(SqlColumn column : columns)
			if(column != null)this.columns.add(column.getName().getValue());
	}
	
	/**
	 * 删除类型
	 * @return
	 */
	public DropType getDropType() {
		return dropType;
	}

	/**
	 * 设定删除类型
	 * @param dropType
	 */
	public void setDropType(DropType dropType) {
		if( dropType != null )
			this.dropType = dropType;
	}

	/*
	 * (non-Javadoc)
	 * @see com.honey.core.dom.sql.ddl.AlterTable#compiledContent(int)
	 */
	@Override
	public CharacterBuilder compiledContent(int indentLevel ) throws CompilationException {
		CharacterBuilder answer = CharacterBuilderFactory.createC16StringBuilder() ;
		boolean newLine = false;
		for(String column :  columns){
			if (newLine)IndentSpace.newLine(answer);else newLine = true;
			
			answer.append( super.compiledContent( indentLevel ) )
			.append( SqlKeyWord.DROP );
			if( dropType == DropType.INDEX ){
				answer.append( SqlKeyWord.INDEX );
			}else if( dropType == DropType.COLUMN ){
				answer.append( SqlKeyWord.COLUMN );
			}else if( dropType == DropType.FOREIGNKEY ){
				answer.append("FOREIGN KEY " );
			}else if( dropType == DropType.CONSTRAINT ){
				answer.append("CONSTRAINT " );
			}else {
				continue;
			}
			answer.append( column )
			.append(SqlKeyWord.OPERATION_SEMICOLON);
		}
		return answer;
	}
	
	
	public enum DropType{
		/**
		 * 不做任何处理
		 */
		NORMAL,
		
		/**
		 * 删除索引
		 */
		INDEX,
		
		/**
		 * 删除列
		 */
		COLUMN,
		
		/**
		 * FOREIGN KEY
		 */
		FOREIGNKEY,
		
		/**
		 * 约束
		 */
		CONSTRAINT,
		;
	}
	
	
}
